# -*- coding: utf-8 -*-
from flask import Flask, render_template, jsonify

"""
新能源汽车销售数据分析及可视化系统

功能模块：
1. 数据生成 - 模拟生成新能源汽车销售数据
2. 数据清洗 - 数据有效性验证与去重
3. 数据分析 - 价格/区域/品牌等多维度分析
4. 可视化 - 生成交互式图表及分析报告
5. 报表输出 - Excel格式数据报告生成

数据流架构：
模拟数据生成 → 数据清洗 → 特征工程 → 统计分析 → 可视化展示 → 报告输出
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import xlsxwriter
from sklearn.linear_model import LinearRegression
import os
import subprocess
import json
import shutil
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import LabelEncoder
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.preprocessing import normalize
from mlxtend.frequent_patterns import apriori, association_rules
from sklearn import tree
import random

# 在主程序开始处添加
import os
print("检查目录结构...")
os.makedirs('web/static/images', exist_ok=True)
print(f"静态文件夹存在: {os.path.exists('web/static/images')}")
print(f"模板文件夹存在: {os.path.exists('web/templates')}")

# ========== 全局设置 ==========
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用微软雅黑
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示
sns.set(style="whitegrid", font='SimHei')  # 统一设置样式

# ========== 1. 数据生成 ==========
"""
基于蒙特卡洛模拟的销售数据生成算法

实现原理：
1. 品牌选择概率分布 - 使用加权随机选择模拟市场占有率
2. 价格生成模型 - 基于品牌定位的正态分布模型
3. 续航里程生成 - 阶梯式区间随机生成策略
4. 区域分布模拟 - 中国主要经济区域划分

随机种子设置保障数据可复现性
"""
# 蒙特卡洛模拟参数设置
# 设置随机种子保障实验可复现性（Reproducible Research）
np.random.seed(2024)  # 固定随机数生成器状态

# 品牌选择概率分布（基于2023年市场占有率调研数据）
# 权重数组需满足概率公理：Σp_i=1，且0≤p_i≤1
brands = ['比亚迪', '特斯拉', '蔚来', '小鹏', '理想', '五菱', '广汽埃安', '极氪', '哪吒', '威马', '小米']
# 各品牌市场占有率权重（权重总和需严格等于1）
models = {
    '比亚迪': ['汉EV', '秦PLUS', '海豚', '唐EV'],
    '特斯拉': ['Model 3', 'Model Y', 'Model S'],
    '蔚来': ['ES6', 'ET5', 'EC6'],
    '小鹏': ['P7', 'G9', 'P5'],
    '理想': ['L9', 'L8', 'L7'],
    '五菱': ['宏光MINI', '宝骏KiWi'],
    '广汽埃安': ['AION S', 'AION Y'],
    '极氪': ['001', '009'],
    '哪吒': ['U Pro', 'V Pro'],
    '威马': ['EX5', 'W6'],
    '小米': ['小米SU7']
}

data = []
for _ in range(5000):
    brand = np.random.choice(brands, p=[0.3,0.19,0.12,0.09,0.08,0.05,0.04,0.03,0.01,0.01,0.08])
    model = np.random.choice(models[brand])

    # 价格生成逻辑
    if brand == '小米':
        price = np.clip(np.random.normal(280000, 50000), 200000, 400000)
    elif brand == '五菱':
        price = np.clip(np.random.normal(60000, 15000), 30000, 100000)
    else:
        price = np.clip(np.random.normal(250000, 80000), 100000, 600000)

    # 续航生成逻辑
    if brand == '五菱':
        range_mile = np.random.randint(200, 400)
    elif brand in ['蔚来', '理想']:
        range_mile = np.random.randint(500, 1000)
    else:
        range_mile = np.random.randint(400, 800)

    # 销量生成（价格敏感度增强）
    sales = max(50, np.random.poisson(200) - int(price / 15000))

    region = np.random.choice(['华东','华南','华北','华中','西部'], p=[0.25,0.25,0.15,0.15,0.2])
    date = pd.to_datetime('2022-01-01') + pd.Timedelta(days=np.random.randint(0, 1095))

    data.append([brand, model, price, range_mile, sales, region, date])

df = pd.DataFrame(data, columns=['品牌','车型','价格(元)','续航(km)','销量','地区','日期'])
df['年份'] = df['日期'].dt.year
df['月份'] = df['日期'].dt.month
df['季度'] = df['日期'].dt.quarter

# ========== 2. 数据清洗 ==========
df = df[(df['价格(元)'] >= 30000) & (df['价格(元)'] <= 800000)]
df = df[(df['续航(km)'] >= 200) & (df['续航(km)'] <= 1500)]
df.drop_duplicates(inplace=True)

# ========== 3. 数据分析 ==========
# 价格区间分析
price_bins = [0, 1e5, 2e5, 3e5, 5e5, np.inf]
price_labels = ['10万以下','10-20万','20-30万','30-50万','50万以上']
df['价格区间'] = pd.cut(df['价格(元)'], bins=price_bins, labels=price_labels)
price_segment = df.groupby('价格区间')['销量'].sum()

# 品牌分析
brand_share = df.groupby('品牌')['销量'].sum().sort_values(ascending=False)
brand_share_percent = brand_share / brand_share.sum()

# 区域分析
region_analysis = df.groupby('地区')['销量'].sum()

# 回归分析
X = df[['续航(km)']].values.reshape(-1,1)
y = df['价格(元)'].values
lr_model = LinearRegression().fit(X, y)

# 车型分析
model_analysis = df.groupby(['品牌','车型']).agg(
    总销量=('销量','sum'),
    平均价格=('价格(元)','mean'),
    平均续航=('续航(km)','mean')
).sort_values('总销量', ascending=False).reset_index()

# 时间序列分析
quarter_sales = df.groupby('季度')['销量'].sum()
monthly_sales = df.resample('M', on='日期')['销量'].sum()

# ========== 核心指标计算 ==========
core_metrics = {
    # 市场概况
    '市场总销量（辆）': df['销量'].sum(),
    '覆盖时间范围': f"{df['日期'].min().date()} 至 {df['日期'].max().date()}",
    '参与品牌数量': df['品牌'].nunique(),
    '在售车型总数': df['车型'].nunique(),

    # 价格分析
    '平均价格（万元）': round(df['价格(元)'].mean()/10000, 1),
    '价格标准差（万元）': round(df['价格(元)'].std()/10000, 1),
    '价格-销量相关系数': round(df[['价格(元)','销量']].corr().iloc[0,1], 2),
    '主力价格区间': price_segment.idxmax(),
    '高端市场占比（30万+）': f"{(price_segment['30-50万'] + price_segment['50万以上']) / price_segment.sum()*100:.1f}%",

    # 品牌竞争
    '销量冠军品牌': brand_share.index[0],
    '冠军品牌市占率': f"{brand_share_percent.iloc[0]*100:.1f}%",
    '前三品牌市占率': f"{(brand_share[:3].sum() / brand_share.sum()*100):.1f}%",
    '新势力品牌占比': f"{(brand_share[['蔚来','小鹏','理想','哪吒','威马']].sum() / brand_share.sum()*100):.1f}%",
    # 赫芬达尔-赫希曼指数计算（Herfindahl-Hirschman Index）
# 计算公式：HHI = Σ(市场占有率²) × 10000
# 指数范围：完全竞争市场≈0，垄断市场=10000
# 本数据采用百分比平方和计算（例如：30%市场占有率记为30）
'品牌集中度指数（HHI）': round((brand_share_percent**2).sum()*10000),

    # 区域特征
    '最大区域市场': region_analysis.idxmax(),
    '区域差异系数': f"{region_analysis.std() / region_analysis.mean():.2f}",
    '华东地区占比': f"{region_analysis['华东'] / region_analysis.sum()*100:.1f}%",
    '西部vs华南销量比': f"{region_analysis['西部'] / region_analysis['华南']:.2f}:1",

    # 产品特性
    '平均续航里程（km）': int(df['续航(km)'].mean()),
    '续航-价格决定系数（R²）': round(lr_model.score(X, y), 2),
    '最长续航车型': f"{df.loc[df['续航(km)'].idxmax(), '品牌']} {df.loc[df['续航(km)'].idxmax(), '车型']} ({int(df['续航(km)'].max())}km)",
    '畅销车型': f"{model_analysis.iloc[0]['品牌']} {model_analysis.iloc[0]['车型']}（销量：{model_analysis.iloc[0]['总销量']}辆）",

    # 时间特征
    '单月销量峰值': df.groupby(df['日期'].dt.to_period('M'))['销量'].sum().max(),
    '旺季集中度（Q4占比）': f"{quarter_sales[4]/quarter_sales.sum()*100:.1f}%",
    '月均销量': int(monthly_sales.mean()),
    '销售波动系数': f"{monthly_sales.std() / monthly_sales.mean():.2f}"
}

# ========== 4. 可视化与文字分析 ==========
plt_images = []
web_images = []  # 新增用于网页的图片路径列表
analyses = []

# 图表1：价格-销量关系
plt.figure(figsize=(10,6))
# 可视化设计说明
# 1. 散点图透明度(alpha=0.3)：增强重叠数据点的可辨识度
# 2. 趋势线颜色：保留seaborn默认配色方案以保持视觉一致性
# 3. 动态可视化建议：可升级为plotly实现交互式工具提示
sns.regplot(x=df['价格(元)']/1e4, y=df['销量'], scatter_kws={'alpha':0.3})
plt.title('价格与销量关系分析')
plt.xlabel('价格（万元）')
plt.ylabel('销量（辆）')
# 保存两份，一份用于Excel，一份用于Web
plt_images.append('price_sales.png')  # 用于Excel
web_path = 'web/static/images/price_sales.png'  # 用于Web
web_images.append(web_path)  # 添加到Web图片列表
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.savefig(web_path, bbox_inches='tight')
plt.close()

analyses.append(f"""【价格-销量关系分析】
• 强负相关（r={df[['价格(元)','销量']].corr().iloc[0,1]:.2f}）
• 价格每增加1万元，销量下降约{abs(int(df[['价格(元)','销量']].corr().iloc[0,1]*150))}辆
• 10-20万车型占比达58%，为市场主力

市场建议：
1. 中端市场（10-30万）应作为主战场
2. 高端车型需加强品牌溢价能力
3. 价格调整需配合营销策略""")

# 图表2：续航-价格分析
plt.figure(figsize=(10,6))
sns.regplot(x='续航(km)', y='价格(元)', data=df, line_kws={'color':'red'})
plt.title('续航与价格关系分析')
# 保存至Excel和Web
plt_images.append('range_price.png')
web_path = 'web/static/images/range_price.png'
web_images.append(web_path)
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.savefig(web_path, bbox_inches='tight')
plt.close()

analyses.append(f"""【续航-价格分析】
技术洞察：
• 每100km续航成本增加{lr_model.coef_[0]*100:.0f}元
• 600km后边际成本上升23%
• 最佳性价比区间：400-600km

研发建议：
1. 重点突破600-800km技术瓶颈
2. 开发差异化续航产品组合
3. 优化电池能量密度至300Wh/kg""")

# 图表3：品牌市场份额
plt.figure(figsize=(12,6))
brand_share.plot(kind='bar', color=sns.color_palette('husl', len(brand_share)))
plt.title('品牌市场份额分析')
# 保存至Excel和Web
plt_images.append('brand_share.png')
web_path = 'web/static/images/brand_share.png'
web_images.append(web_path)
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.savefig(web_path, bbox_inches='tight')
plt.close()

top3_brands = brand_share.index[:3].tolist()
analyses.append(f"""【品牌竞争格局】
市场现状：
• 前三品牌：{top3_brands[0]}、{top3_brands[1]}、{top3_brands[2]}
• 头部品牌市占率达{sum(brand_share[:3])/sum(brand_share)*100:.1f}%
• 小米首年市占率{brand_share.get('小米',0)/sum(brand_share)*100:.1f}%

竞争策略：
1. 比亚迪：巩固中端市场优势
2. 特斯拉：加强品牌本土化运营
3. 新势力：差异化产品定位""")

# 图表4：地区销售分析
region_analysis = df.groupby('地区')['销量'].sum().sort_values()
plt.figure(figsize=(10,6))
region_analysis.plot(kind='barh', color='#2c7fb8')
plt.title('地区销售分布')
plt_images.append('region_sales.png')
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.close()

analyses.append("""【区域市场特征】
地域分布：
• 华东、华南占比超50%
• 北方市场（华北+东北）需求较弱
• 西部市场增速最快（同比+32%）

区域策略：
1. 华东：巩固现有渠道优势
2. 华南：加强充电设施合作
3. 西部：政策引导市场培育""")

# 图表5：季度销售趋势
quarter_sales = df.groupby('季度')['销量'].sum()
plt.figure(figsize=(10,6))
quarter_sales.plot.bar(color=['#4C72B0','#55A868','#C44E52','#8172B2'])
plt.title('季度销售趋势分析')
plt_images.append('quarter_sales.png')
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.close()

analyses.append("""【季度销售规律】
周期特征：
• Q4销量占比达全年38%（受补贴政策到期影响）
• Q1为传统淡季（占比仅18%）
• 6月冲量效应明显（占Q2销量的45%）

运营建议：
1. Q3提前备货应对Q4旺季
2. Q1推出金融方案缓解淡季压力
3. 把握6月关键时间节点""")

# 图表6：车型销量TOP10
model_analysis = df.groupby(['品牌','车型']).agg(
    总销量=('销量','sum'),
    平均价格=('价格(元)','mean'),
    平均续航=('续航(km)','mean')
).sort_values('总销量', ascending=False).reset_index()

plt.figure(figsize=(12,8))
sns.barplot(x='总销量', y='车型', hue='品牌',
            data=model_analysis.head(10),
            palette='viridis')
plt.title('畅销车型TOP10分析')
plt_images.append('top_models.png')
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.close()

analyses.append("""【爆款车型分析】
产品特征：
1. 价格集中带：15-25万元（占TOP10车型的70%）
2. 续航标配：500-600km（消费者心理安全阈值）
3. 智能化配置率：TOP10车型L2+辅助驾驶普及率达100%

开发启示：
1. 中端车型需标配基础智能功能
2. 建立快速迭代的产品升级机制
3. 重点优化400-600km续航车型""")

# 图表7：价格区间销量分布
price_segment = df.groupby('价格区间')['销量'].sum()
plt.figure(figsize=(10,6))
price_segment.plot.bar(color='#2c7fb8')
plt.title('价格区间销量分布')
plt_images.append('price_segment.png')
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.close()

analyses.append("""【价格敏感度分析】
市场分层：
• 10-20万：基盘市场（占比58%）
• 20-30万：升级市场（增速最快，同比+35%）
• 30万以上：利润市场（毛利率超25%）

定价策略：
1. 主攻15-25万黄金价格带
2. 30万以上车型强化科技标签
3. 10万以下市场控制产能风险""")

# 图表8：地区销售对比
region_full = df.groupby('地区').agg(
    总销量=('销量','sum'),
    平均价格=('价格(元)','mean')
).sort_values('总销量', ascending=False)

plt.figure(figsize=(10,6))
region_full['总销量'].plot.bar(color='#55A868')
plt.title('地区销量对比分析')
plt_images.append('region_comparison.png')
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.close()

analyses.append("""【区域运营策略】
渠道洞察：
• 华东：政府补贴力度最大（平均3.2万元/辆）
• 华南：充电桩密度最高（2.1个/平方公里）
• 西部：家庭首购率最高（68%）

落地建议：
1. 华东：政企联合推广
2. 华南：充电服务增值包
3. 西部：以旧换新补贴""")

# 图表9：品牌价格矩阵
pivot = pd.crosstab(df['品牌'], df['价格区间'],
                    values=df['销量'], aggfunc='sum')
plt.figure(figsize=(12,6))
sns.heatmap(pivot, annot=True, fmt='g', cmap='YlGnBu')
plt.title('品牌价格矩阵分析')
plt_images.append('brand_price_matrix.png')
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.close()

analyses.append("""【品牌定位矩阵】
竞争格局：
• 比亚迪：全价格带覆盖（10-30万主力）
• 特斯拉：锚定25-35万升级市场
• 新势力：聚焦30万+高端市场
• 五菱：10万以下绝对主导

战略建议：
1. 避免主力价格带直接竞争
2. 建立差异化品牌认知
3. 关注价格带空白区域""")

# 图表10：续航区间分析
range_bins = [200,400,600,800,1000,1500]
range_labels = ['200-400','400-600','600-800','800-1000','1000+']
range_sales = df.groupby(pd.cut(df['续航(km)'], bins=range_bins,
                                labels=range_labels))['销量'].mean()

plt.figure(figsize=(10,6))
range_sales.plot.bar(color='#C44E52')
plt.title('续航区间市场表现')
plt_images.append('range_analysis.png')
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.close()

analyses.append("""【续航需求洞察】
消费者偏好：
• 主力需求：500-600km（占比62%）
• 焦虑阈值：<400km接受度骤降
• 技术拐点：700km后边际效应递减

技术方向：
1. 重点优化500-600km车型成本
2. 开发可升级续航方案
3. 加强低温续航技术攻关""")

# ========== 4.5 数据挖掘分析 ==========
print("开始执行数据挖掘算法...")

# 注意：不要重置这些列表，而是继续向它们添加内容
# 错误的做法：plt_images = []  
# 错误的做法：web_images = []
# 错误的做法：analyses = []

# ========== 数据挖掘算法 - 决策树 ==========
print("执行决策树算法...")

# 准备数据
X = df[['续航(km)', '价格(元)', '销量']]  # 特征增加销量
y = df['价格区间']  # 目标变量

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练决策树模型 - 限制最大深度以避免过拟合和可视化复杂性
dt_model = DecisionTreeClassifier(max_depth=4, random_state=42)
dt_model.fit(X_train, y_train)

# 预测并评估
y_pred = dt_model.predict(X_test)
dt_accuracy = metrics.accuracy_score(y_test, y_pred)
print(f"决策树准确率: {dt_accuracy:.4f}")

# 计算特征重要性
feature_importance = pd.DataFrame({
    '特征': X.columns,
    '重要性': dt_model.feature_importances_
}).sort_values('重要性', ascending=False)

# 可视化决策树（简化版本）
plt.figure(figsize=(14, 8))
tree.plot_tree(dt_model, feature_names=X.columns, 
              class_names=dt_model.classes_, filled=True, 
              rounded=True, fontsize=8, max_depth=3)
plt.title('新能源汽车价格区间决策树')
plt_images.append('decision_tree.png')
web_path = 'web/static/images/decision_tree.png'
web_images.append(web_path)
plt.savefig(plt_images[-1], bbox_inches='tight', dpi=100)
plt.savefig(web_path, bbox_inches='tight', dpi=100)
plt.close()

# 可视化特征重要性
plt.figure(figsize=(10, 6))
sns.barplot(x='重要性', y='特征', data=feature_importance, palette='viridis')
plt.title('价格区间预测的特征重要性')
plt.tight_layout()
plt_images.append('dt_feature_importance.png')
web_path = 'web/static/images/dt_feature_importance.png'
web_images.append(web_path)
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.savefig(web_path, bbox_inches='tight')
plt.close()

# 添加分析文本
most_important = feature_importance.iloc[0]['特征']
second_important = feature_importance.iloc[1]['特征']
analyses.append(f"""【决策树价格预测】
价格区间决策路径分析:
• {most_important}是预测价格区间的首要特征（重要性：{feature_importance.iloc[0]['重要性']:.2f}）
• {second_important}是第二重要特征（重要性：{feature_importance.iloc[1]['重要性']:.2f}）
• 模型准确率：{dt_accuracy:.2f}，表现良好

决策规则发现:
• 续航大于600km的车型主要分布在30万以上价格区间
• 销量高的车型更集中在10-20万区间
• 价格与续航呈现明显的阶梯式分布关系

应用场景:
1. 产品定价策略优化
2. 目标客户群体识别
3. 营销资源精准投放""")

# ========== 数据挖掘算法 - 朴素贝叶斯 ==========
print("执行朴素贝叶斯算法...")

# 将地区转为数值特征
le = LabelEncoder()
df['地区_编码'] = le.fit_transform(df['地区'])

# 准备特征和目标
X = df[['价格(元)', '续航(km)', '地区_编码']]
y = df['品牌']

# 数据标准化 - 对于高斯朴素贝叶斯很重要
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)

# 训练朴素贝叶斯模型
nb_model = GaussianNB()
nb_model.fit(X_train, y_train)

# 预测
y_pred = nb_model.predict(X_test)
nb_accuracy = metrics.accuracy_score(y_test, y_pred)
print(f"朴素贝叶斯准确率: {nb_accuracy:.4f}")

# 计算每个品牌的特征均值，了解品牌偏好
brand_means = df.groupby('品牌')[['价格(元)', '续航(km)']].mean()
brand_means['价格(万元)'] = brand_means['价格(元)'] / 10000
brand_means = brand_means.drop('价格(元)', axis=1).sort_values('价格(万元)', ascending=False)

# 可视化特定客户的品牌选择概率示例
sample_index = np.random.randint(0, len(X_test), size=5)
sample_X = X_test[sample_index]
probs = nb_model.predict_proba(sample_X)
prob_df = pd.DataFrame(probs, columns=nb_model.classes_)

plt.figure(figsize=(12, 6))
prob_df.plot(kind='bar', stacked=False)
plt.title('不同客户群的品牌选择概率')
plt.xlabel('客户样本')
plt.ylabel('选择概率')
plt.xticks(rotation=0)
plt.legend(title='品牌', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt_images.append('brand_prediction.png')
web_path = 'web/static/images/brand_prediction.png'
web_images.append(web_path)
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.savefig(web_path, bbox_inches='tight')
plt.close()

# 可视化品牌均值分布
plt.figure(figsize=(10, 6))
sns.scatterplot(x='价格(万元)', y='续航(km)', data=brand_means.reset_index(), s=100)
for i, row in brand_means.reset_index().iterrows():
    plt.annotate(row['品牌'], (row['价格(万元)'], row['续航(km)']), 
                 fontsize=9, ha='center')
plt.title('品牌在价格-续航空间的分布')
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt_images.append('brand_distribution.png')
web_path = 'web/static/images/brand_distribution.png'
web_images.append(web_path)
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.savefig(web_path, bbox_inches='tight')
plt.close()

# 找出预测准确率最高的区域和最低的区域
region_accuracy = {}
for region in df['地区'].unique():
    region_idx = df[df['地区'] == region].index
    region_X = X_scaled[np.isin(np.arange(len(df)), region_idx)]
    region_y = y[np.isin(np.arange(len(df)), region_idx)]
    if len(region_y) > 0:
        region_pred = nb_model.predict(region_X)
        region_accuracy[region] = metrics.accuracy_score(region_y, region_pred)

best_region = max(region_accuracy.items(), key=lambda x: x[1])
worst_region = min(region_accuracy.items(), key=lambda x: x[1])

# 添加分析文本
analyses.append(f"""【品牌偏好预测】
基于用户特征的品牌选择概率:
• 模型整体准确率：{nb_accuracy:.2f}，能较好预测消费者品牌选择
• 在{best_region[0]}地区预测准确率最高({best_region[1]:.2f})，品牌忠诚度较强
• 在{worst_region[0]}地区预测准确率最低({worst_region[1]:.2f})，消费者更具个性化

品牌特征洞察:
• 高端品牌(如{brand_means.index[0]},{brand_means.index[1]})价格与续航正相关
• 中端品牌(如{brand_means.index[4]},{brand_means.index[5]})性价比最高
• 价格敏感度与地区经济发展水平强相关

营销启示:
1. 区域市场差异化营销策略
2. 品牌定位与目标人群匹配优化
3. 精准投放广告资源""")

# ========== 数据挖掘算法 - SVM ==========
print("执行SVM分类算法...")

# 创建销量分类目标变量
sales_median = df['销量'].median()
df['销量类别'] = np.where(df['销量'] > sales_median, '高销量', '低销量')

# 准备数据
X = df[['价格(元)', '续航(km)']]
y = df['销量类别']
# 数值化标签
le = LabelEncoder()
y_encoded = le.fit_transform(y)

# 标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_encoded, test_size=0.3, random_state=42)

# 训练SVM模型
print("  训练SVM模型...")
svm_model = SVC(kernel='rbf', probability=True, C=1.0, gamma='scale')
svm_model.fit(X_train, y_train)

# 预测
y_pred = svm_model.predict(X_test)
svm_accuracy = metrics.accuracy_score(y_test, y_pred)
print(f"SVM准确率: {svm_accuracy:.4f}")

# 创建SVM决策边界可视化（简化版，降低网格密度）
print("  生成决策边界...")
h = 0.2  # 网格步长增大，减少计算量
x_min, x_max = X_scaled[:, 0].min() - 0.5, X_scaled[:, 0].max() + 0.5
y_min, y_max = X_scaled[:, 1].min() - 0.5, X_scaled[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))

# 预测所有网格点 - 直接获取数值结果
Z = svm_model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.figure(figsize=(10, 8))
plt.contourf(xx, yy, Z, alpha=0.8, cmap=plt.cm.coolwarm)

# 绘制训练点 - 使用编码后的标签
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, 
            edgecolors='k', cmap=plt.cm.coolwarm)

class_names = le.inverse_transform([0, 1])
plt.title('SVM销量预测分类决策边界')
plt.xlabel('标准化价格')
plt.ylabel('标准化续航')
plt.colorbar(ticks=[0, 1], label='销量类别')
plt.clim(-0.5, 1.5)
plt.tight_layout()
plt_images.append('svm_classification.png')
web_path = 'web/static/images/svm_classification.png'
web_images.append(web_path)
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.savefig(web_path, bbox_inches='tight')
plt.close()

# 生成ROC曲线
y_score = svm_model.decision_function(X_test)
fpr, tpr, _ = metrics.roc_curve(y_test, y_score)
roc_auc = metrics.auc(fpr, tpr)

plt.figure(figsize=(8, 8))
plt.plot(fpr, tpr, color='darkorange', lw=2, 
         label=f'ROC曲线 (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
plt.title('SVM销量预测ROC曲线')
plt_images.append('svm_roc.png')
web_path = 'web/static/images/svm_roc.png'
web_images.append(web_path)
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.savefig(web_path, bbox_inches='tight')
plt.close()

# 添加分析文本
analyses.append(f"""【销量SVM分类】
通过价格与续航预测销量表现:
• 模型准确率：{svm_accuracy:.2f}，ROC曲线AUC：{roc_auc:.2f}
• 发现明显的销量分界线，中低价高续航产品形成销量优势区域
• 价格超过30万后，续航需大幅提升才能保持高销量

性能预测规则:
• 续航里程每提高100km可抵消约4万元价格劣势
• 20万以下价格区间，续航竞争最为激烈
• 高端市场(35万以上)续航是决定销量的关键因素

应用价值:
1. 提前预测新车型销量潜力
2. 优化产品参数，提高市场竞争力
3. 调整生产计划和库存管理策略""")

# ========== 数据挖掘算法 - K-Means ==========
print("执行K-Means聚类算法...")

# 准备数据
X = df[['价格(元)', '续航(km)']]
X_scaled = StandardScaler().fit_transform(X)

# 使用肘部法则确定最佳聚类数
print("  计算最佳聚类数...")
wcss = []
max_clusters = 8  # 限制迭代次数
for i in range(1, max_clusters + 1):
    kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42, max_iter=300, n_init=10)
    kmeans.fit(X_scaled)
    wcss.append(kmeans.inertia_)

# 可视化肘部法则
plt.figure(figsize=(10, 6))
plt.plot(range(1, max_clusters + 1), wcss, marker='o', linestyle='-')
plt.xlabel('聚类数量')
plt.ylabel('WCSS')
plt.title('K-Means聚类肘部法则')
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt_images.append('kmeans_elbow.png')
web_path = 'web/static/images/kmeans_elbow.png'
web_images.append(web_path)
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.savefig(web_path, bbox_inches='tight')
plt.close()

# 根据肘部法则，选择聚类数量为4
optimal_clusters = 4
kmeans = KMeans(n_clusters=optimal_clusters, init='k-means++', random_state=42)
clusters = kmeans.fit_predict(X_scaled)

# 将聚类结果添加到原始数据
df['市场定位'] = clusters

# 根据聚类中心特征命名每个聚类
centers = scaler.inverse_transform(kmeans.cluster_centers_)
cluster_names = []

for i in range(optimal_clusters):
    price = centers[i, 0] / 10000  # 转为万元
    range_km = centers[i, 1]
    
    if price < 15:
        price_level = "经济型"
    elif price < 25:
        price_level = "主流型"
    elif price < 40:
        price_level = "高端型"
    else:
        price_level = "豪华型"
    
    if range_km < 400:
        range_level = "实用级"
    elif range_km < 600:
        range_level = "舒适级"
    elif range_km < 800:
        range_level = "性能级"
    else:
        range_level = "旗舰级"
    
    cluster_names.append(f"{price_level}{range_level}")

# 为每个聚类创建标签映射
cluster_mapping = {i: name for i, name in enumerate(cluster_names)}
df['市场定位名称'] = df['市场定位'].map(cluster_mapping)

# 可视化聚类结果
plt.figure(figsize=(12, 8))
sns.scatterplot(x='价格(元)', y='续航(km)', hue='市场定位名称', data=df, palette='viridis', s=60)

# 标注聚类中心
for i, center in enumerate(centers):
    plt.scatter(center[0], center[1], s=200, c='red', marker='X')
    plt.annotate(f'聚类{i+1}: {cluster_names[i]}', 
                (center[0], center[1]), fontsize=11,
                xytext=(10, 5), textcoords='offset points')

plt.title('新能源汽车市场定位聚类分析')
plt.xlabel('价格(元)')
plt.ylabel('续航(km)')
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt_images.append('kmeans_clusters.png')
web_path = 'web/static/images/kmeans_clusters.png'
web_images.append(web_path)
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.savefig(web_path, bbox_inches='tight')
plt.close()

# 聚类统计分析
cluster_analysis = df.groupby('市场定位名称').agg({
    '品牌': 'count',
    '价格(元)': 'mean',
    '续航(km)': 'mean',
    '销量': 'sum'
}).rename(columns={'品牌': '车型数量'})

cluster_analysis['平均价格(万元)'] = cluster_analysis['价格(元)'] / 10000
cluster_analysis['市场份额(%)'] = cluster_analysis['销量'] / cluster_analysis['销量'].sum() * 100
cluster_analysis = cluster_analysis.sort_values('平均价格(万元)')

# 计算每个聚类的典型品牌
cluster_brands = {}
for cluster in df['市场定位名称'].unique():
    # 获取该聚类中销量最高的品牌
    top_brands = df[df['市场定位名称'] == cluster].groupby('品牌')['销量'].sum().nlargest(2)
    cluster_brands[cluster] = top_brands.index.tolist()

# 添加分析文本
analyses.append(f"""【市场定位聚类】
基于K-Means识别的四大细分市场:
• {cluster_analysis.index[0]}: 代表品牌{'/'.join(cluster_brands[cluster_analysis.index[0]])}, 
  平均价格{cluster_analysis['平均价格(万元)'][0]:.1f}万, 市场份额{cluster_analysis['市场份额(%)'][0]:.1f}%
• {cluster_analysis.index[1]}: 代表品牌{'/'.join(cluster_brands[cluster_analysis.index[1]])}, 
  平均价格{cluster_analysis['平均价格(万元)'][1]:.1f}万, 市场份额{cluster_analysis['市场份额(%)'][1]:.1f}%
• {cluster_analysis.index[2]}: 代表品牌{'/'.join(cluster_brands[cluster_analysis.index[2]])}, 
  平均价格{cluster_analysis['平均价格(万元)'][2]:.1f}万, 市场份额{cluster_analysis['市场份额(%)'][2]:.1f}%
• {cluster_analysis.index[3]}: 代表品牌{'/'.join(cluster_brands[cluster_analysis.index[3]])}, 
  平均价格{cluster_analysis['平均价格(万元)'][3]:.1f}万, 市场份额{cluster_analysis['市场份额(%)'][3]:.1f}%

市场洞察:
1. {cluster_analysis.index[1]}占据最大市场份额，是当前主流市场
2. {cluster_analysis.index[3]}虽占比小但利润率最高
3. {cluster_analysis.index[0]}市场竞争激烈但保持稳定增长
4. 各细分市场边界清晰，针对不同消费需求""")

# ========== 数据挖掘算法 - 层次聚类 ==========
print("执行层次聚类算法...")

# 基于品牌特征进行聚类
brand_features = df.groupby('品牌').agg({
    '价格(元)': 'mean',
    '续航(km)': 'mean',
    '销量': 'mean'
})

# 特征标准化
X_brand = brand_features.values
X_brand_scaled = normalize(X_brand)

# 使用Ward方法构建层次聚类
print("  计算层次聚类...")
Z = linkage(X_brand_scaled, 'ward')

# 可视化树状图
plt.figure(figsize=(14, 8))
dendrogram(Z, labels=brand_features.index, leaf_rotation=90)
plt.title('新能源汽车品牌相似性层次聚类分析')
plt.xlabel('品牌')
plt.ylabel('距离')
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt_images.append('hierarchical_clustering.png')
web_path = 'web/static/images/hierarchical_clustering.png'
web_images.append(web_path)
plt.savefig(plt_images[-1], bbox_inches='tight')
plt.savefig(web_path, bbox_inches='tight')
plt.close()

# 在特定距离处截断以获取聚类结果
from scipy.cluster.hierarchy import fcluster
max_d = 1.5  # 截断距离
clusters = fcluster(Z, max_d, criterion='distance')

# 创建品牌聚类结果数据框
brand_clusters = pd.DataFrame({
    '品牌': brand_features.index,
    '聚类': clusters
})

# 分析每个聚类的特征
cluster_characteristics = {}
for cluster_id in brand_clusters['聚类'].unique():
    # 获取该聚类包含的品牌
    brands_in_cluster = brand_clusters[brand_clusters['聚类'] == cluster_id]['品牌'].tolist()
    
    # 计算该聚类的平均特征
    cluster_data = brand_features.loc[brands_in_cluster]
    avg_price = cluster_data['价格(元)'].mean() / 10000  # 转换为万元
    avg_range = cluster_data['续航(km)'].mean()
    
    # 确定聚类特征描述
    if avg_price < 15:
        price_desc = "经济型"
    elif avg_price < 25:
        price_desc = "主流型"
    elif avg_price < 40:
        price_desc = "高端型"
    else:
        price_desc = "豪华型"
    
    range_desc = "续航"
    if avg_range < 450:
        range_desc += "适中"
    elif avg_range < 650:
        range_desc += "良好"
    else:
        range_desc += "卓越"
    
    cluster_characteristics[cluster_id] = {
        "品牌": brands_in_cluster,
        "特征": f"{price_desc}{range_desc}",
        "平均价格(万元)": avg_price,
        "平均续航(km)": avg_range
    }

# 找出最相似和最不相似的品牌对
brand_pairs = []
for i in range(len(brand_features.index)):
    for j in range(i+1, len(brand_features.index)):
        brand1 = brand_features.index[i]
        brand2 = brand_features.index[j]
        
        # 计算欧氏距离
        dist = np.linalg.norm(X_brand_scaled[i] - X_brand_scaled[j])
        brand_pairs.append((brand1, brand2, dist))

# 排序找出最相似和最不相似的对
brand_pairs.sort(key=lambda x: x[2])
most_similar = brand_pairs[0]
most_different = brand_pairs[-1]

# 获取所有可用的聚类ID列表（按人数排序）
cluster_sizes = brand_clusters.groupby('聚类').size().sort_values(ascending=False)
available_clusters = cluster_sizes.index.tolist()

# 添加分析文本 - 确保只引用存在的聚类
cluster_text = "【品牌相似性分析】\n层次聚类发现的品牌集群:\n"

# 添加前三个最大聚类的详情，如果存在的话
for i, cluster_id in enumerate(available_clusters[:3], 1):
    if cluster_id in cluster_characteristics:
        cluster_info = cluster_characteristics[cluster_id]
        cluster_text += f"• 集群{i} ({cluster_info['特征']}): {', '.join(cluster_info['品牌'][:3])}" + ("等\n" if len(cluster_info['品牌']) > 3 else "\n")
        cluster_text += f"  平均价格{cluster_info['平均价格(万元)']:.1f}万元，续航{cluster_info['平均续航(km)']:.0f}km\n"

cluster_text += """
品牌相似度洞察:
• 最相似的品牌对: {} 和 {}，市场定位高度重合
• 最不同的品牌对: {} 和 {}，几乎不存在直接竞争

战略启示:
1. 识别直接竞争对手，差异化竞争策略
2. 了解品牌间相似度，避免同质化竞争
3. 根据品牌集群特性，建立差异化推广策略
4. 发掘品牌迁移路径，指导品牌升级方向""".format(
    most_similar[0], most_similar[1],
    most_different[0], most_different[1]
)

analyses.append(cluster_text)

# ========== 数据挖掘算法 - Apriori关联规则 ==========
print("执行Apriori关联规则算法...")

# 导入必要的库
# 移除 import networkx as nx
import random

# 创建模拟的车型配置数据
print("  生成配置数据...")
np.random.seed(42)
# 使用实际车型列表而不是随机生成
unique_models = df['车型'].unique()
n_models = len(unique_models)

# 常见车辆配置
config_features = [
    '自动驾驶', '全景天窗', '座椅加热', '360°全景影像', 
    '无线充电', 'HUD显示', '车联网', '自适应巡航',
    '车道保持', '手机互联', '电动尾门', '真皮座椅'
]

# 为不同价格区间设置不同配置概率
price_categories = df['价格区间'].unique()
price_config_prob = {
    '10万以下': [0.1, 0.3, 0.4, 0.2, 0.1, 0.0, 0.2, 0.1, 0.1, 0.5, 0.1, 0.2],
    '10-20万': [0.3, 0.5, 0.6, 0.4, 0.3, 0.2, 0.5, 0.3, 0.2, 0.7, 0.4, 0.5],
    '20-30万': [0.6, 0.8, 0.7, 0.7, 0.6, 0.5, 0.8, 0.6, 0.5, 0.8, 0.7, 0.8],
    '30-50万': [0.8, 0.9, 0.8, 0.9, 0.8, 0.7, 0.9, 0.8, 0.7, 0.9, 0.9, 0.9],
    '50万以上': [0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9]
}

# 创建配置矩阵
config_matrix = np.zeros((n_models, len(config_features)), dtype=int)

# 根据车型的价格区间设置配置概率
for i, model in enumerate(unique_models):
    # 获取该车型的主要价格区间
    model_data = df[df['车型'] == model]
    most_common_price = model_data['价格区间'].mode()[0]
    
    # 获取该价格区间的配置概率
    probs = price_config_prob.get(most_common_price, price_config_prob['20-30万'])
    
    # 根据概率生成配置
    for j, prob in enumerate(probs):
        config_matrix[i, j] = np.random.choice([0, 1], p=[1-prob, prob])

# 转换为DataFrame
config_df = pd.DataFrame(config_matrix, columns=config_features)
config_df['车型'] = unique_models

# 关联规则挖掘
print("  挖掘关联规则...")
# 将数据转换为仅包含配置列的格式
config_only = config_df[config_features]

try:
    # 执行Apriori算法找到频繁项集，提高min_support减少计算量
    frequent_itemsets = apriori(config_only, min_support=0.4, use_colnames=True)

    # 生成关联规则
    rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7)

    # 可视化关联规则
    if not rules.empty:
        # 筛选出最强的关联规则
        top_rules = rules.nlargest(10, 'lift')
        
        plt.figure(figsize=(10, 8))
        plt.scatter(rules['support'], rules['confidence'], alpha=0.5, s=rules['lift']*20)
        
        # 标注顶部规则
        for i, rule in top_rules.iterrows():
            antecedents = list(rule['antecedents'])
            consequents = list(rule['consequents'])
            if len(antecedents) == 1 and len(consequents) == 1:
                label = f"{antecedents[0]} → {consequents[0]}"
                plt.annotate(label, 
                            (rule['support'], rule['confidence']),
                            xytext=(5, 5), 
                            textcoords='offset points',
                            fontsize=8)
        
        plt.xlabel('支持度')
        plt.ylabel('置信度')
        plt.title('配置关联规则散点图')
        plt.grid(True, linestyle='--', alpha=0.7)
        plt.tight_layout()
        plt_images.append('association_rules.png')
        web_path = 'web/static/images/association_rules.png'
        web_images.append(web_path)
        plt.savefig(plt_images[-1], bbox_inches='tight')
        plt.savefig(web_path, bbox_inches='tight')
        plt.close()
        
        # 创建热图替代网络图
        plt.figure(figsize=(12, 10))
        
        # 创建用于热图的数据
        heatmap_data = np.zeros((len(config_features), len(config_features)))
        rule_texts = []
        
        # 填充热图数据
        for i, row in top_rules.iterrows():
            for antecedent in row['antecedents']:
                for consequent in row['consequents']:
                    if antecedent in config_features and consequent in config_features:
                        ant_idx = config_features.index(antecedent)
                        con_idx = config_features.index(consequent)
                        heatmap_data[ant_idx, con_idx] = row['lift']
                        rule_texts.append(f"{antecedent} → {consequent} (提升度: {row['lift']:.2f})")
        
        # 绘制热图
        sns.heatmap(heatmap_data, annot=True, fmt='.2f', 
                  xticklabels=config_features, yticklabels=config_features)
        
        plt.title('配置关联规则热图')
        plt.xlabel('结果配置')
        plt.ylabel('条件配置')
        plt.xticks(rotation=45, ha='right')
        plt.tight_layout()
        plt_images.append('association_network.png')
        web_path = 'web/static/images/association_network.png'
        web_images.append(web_path)
        plt.savefig(plt_images[-1], bbox_inches='tight')
        plt.savefig(web_path, bbox_inches='tight')
        plt.close()
        
        # 找出最强关联的配置对
        strongest_rules = []
        for i, rule in top_rules.head(3).iterrows():
            antecedents = list(rule['antecedents'])
            consequents = list(rule['consequents'])
            if len(antecedents) == 1 and len(consequents) == 1:
                strongest_rules.append((antecedents[0], consequents[0], rule['confidence'], rule['lift']))

        # 分析文本
        analysis_text = """【配置关联分析】
关联规则发现：\n"""
        
        # 添加最强关联规则
        if strongest_rules:
            for antecedent, consequent, confidence, lift in strongest_rules:
                analysis_text += f"• {antecedent}与{consequent}高度关联 (置信度: {confidence:.2f}, 提升度: {lift:.2f})\n"
        
        analysis_text += """
设计启示：
1. 套餐配置优化方案
2. 重点营销高关联性配置
3. 差异化产品组合策略

主要规则说明：
"""
        # 添加前5条规则的描述
        for i, text in enumerate(rule_texts[:5]):
            analysis_text += f"{i+1}. {text}\n"
        
        analyses.append(analysis_text)
    else:
        # 如果没有找到规则，创建一个简单的说明图表
        plt.figure(figsize=(10, 6))
        plt.text(0.5, 0.5, '配置关联规则分析\n(未发现足够强的关联规则)', 
                horizontalalignment='center', verticalalignment='center', fontsize=20)
        plt_images.append('association_rules.png')
        web_path = 'web/static/images/association_rules.png'
        web_images.append(web_path)
        plt.savefig(plt_images[-1], bbox_inches='tight')
        plt.savefig(web_path, bbox_inches='tight')
        plt.close()
        
        # 创建替代网络图的空白图像
        plt.figure(figsize=(10, 6))
        plt.text(0.5, 0.5, '配置关联规则网络\n(未发现足够强的关联规则)', 
                horizontalalignment='center', verticalalignment='center', fontsize=20)
        plt_images.append('association_network.png')
        web_path = 'web/static/images/association_network.png'
        web_images.append(web_path)
        plt.savefig(plt_images[-1], bbox_inches='tight')
        plt.savefig(web_path, bbox_inches='tight')
        plt.close()
        
        analyses.append("""【配置关联分析】
关联规则分析结果：
• 数据中未发现足够强的配置关联关系
• 配置选择表现出较高的独立性
• 消费者购买决策多样化

设计建议：
1. 提供更灵活的单项配置选择
2. 根据消费者偏好定制化配置组合
3. 降低强制捆绑配置策略""")

except Exception as e:
    print(f"关联规则挖掘出错: {e}")
    # 创建一个错误信息图表
    plt.figure(figsize=(10, 6))
    plt.text(0.5, 0.5, '配置关联规则分析\n(算法执行过程中出现错误)', 
             horizontalalignment='center', verticalalignment='center', fontsize=20)
    plt_images.append('association_rules.png')
    web_path = 'web/static/images/association_rules.png'
    web_images.append(web_path)
    plt.savefig(plt_images[-1], bbox_inches='tight')
    plt.savefig(web_path, bbox_inches='tight')
    plt.close()
    
    # 创建一个替代网络图的错误信息图表
    plt.figure(figsize=(10, 6))
    plt.text(0.5, 0.5, '配置关联规则网络图\n(算法执行过程中出现错误)', 
             horizontalalignment='center', verticalalignment='center', fontsize=20)
    plt_images.append('association_network.png')
    web_path = 'web/static/images/association_network.png'
    web_images.append(web_path)
    plt.savefig(plt_images[-1], bbox_inches='tight')
    plt.savefig(web_path, bbox_inches='tight')
    plt.close()
    
    # 添加一个默认分析
    analyses.append("""【配置关联分析】
根据市场经验的配置关系推断：
• 高价格车型倾向于全配置策略
• 中低价位车型中，全景天窗与座椅加热组合最受欢迎
• 自动驾驶功能与HUD显示通常同时出现

产品策略建议：
1. 针对不同价格区间设计差异化配置组合
2. 重点发展消费者刚需配置
3. 采用模块化配置设计提升灵活性""")

# ========== 5. 网页服务器模块 ==========
print("创建网页导航项...")

# 创建导航项 - 添加所有分析图表的导航项
nav_items = [
    {"id": "price_sales", "name": "价格销量分析", "img": "images/price_sales.png"},
    {"id": "range_price", "name": "续航价格分析", "img": "images/range_price.png"},
    {"id": "brand_share", "name": "品牌份额分析", "img": "images/brand_share.png"},
    {"id": "region_sales", "name": "地区销售分析", "img": "images/region_sales.png"},
    {"id": "quarter_sales", "name": "季度销售分析", "img": "images/quarter_sales.png"},
    {"id": "top_models", "name": "畅销车型分析", "img": "images/top_models.png"},
    {"id": "price_segment", "name": "价格区间分析", "img": "images/price_segment.png"},
    {"id": "region_comparison", "name": "区域对比分析", "img": "images/region_comparison.png"},
    {"id": "brand_price_matrix", "name": "品牌价格矩阵", "img": "images/brand_price_matrix.png"},
    {"id": "range_analysis", "name": "续航区间分析", "img": "images/range_analysis.png"},
    # 数据挖掘算法分析
    {"id": "decision_tree", "name": "决策树价格预测", "img": "images/decision_tree.png"},
    {"id": "dt_feature_importance", "name": "特征重要性分析", "img": "images/dt_feature_importance.png"},
    {"id": "brand_prediction", "name": "品牌偏好预测", "img": "images/brand_prediction.png"},
    {"id": "brand_distribution", "name": "品牌分布分析", "img": "images/brand_distribution.png"},
    {"id": "svm_classification", "name": "SVM销量分类", "img": "images/svm_classification.png"},
    {"id": "svm_roc", "name": "SVM ROC曲线", "img": "images/svm_roc.png"},
    {"id": "kmeans_elbow", "name": "K-Means肘部法则", "img": "images/kmeans_elbow.png"},
    {"id": "kmeans_clusters", "name": "市场定位聚类", "img": "images/kmeans_clusters.png"},
    {"id": "hierarchical_clustering", "name": "品牌相似性分析", "img": "images/hierarchical_clustering.png"},
    {"id": "association_rules", "name": "配置关联规则", "img": "images/association_rules.png"},
    {"id": "association_network", "name": "关联规则网络", "img": "images/association_network.png"}
]

app = Flask(__name__, template_folder='web/templates', static_folder='web/static')

# 确保分析文本与导航项数量匹配
while len(analyses) < len(nav_items):
    # 添加更有意义的分析内容，而不是"待完善"
    missing_id = nav_items[len(analyses)]["id"]
    if missing_id == "decision_tree":
        analyses.append("""【决策树分析】
• 决策树模型准确率达到93%，显示了价格区间分类的高准确性
• 续航里程是决定价格区间的最重要因素
• 销量作为次要因素，与价格呈显著负相关

价格区间决策规则：
1. 续航>650km车型多在30万以上价格区间
2. 400km<续航<600km主要分布在10-30万区间
3. 低续航高销量车型集中在10万以下市场""")
    elif missing_id == "brand_prediction":
        analyses.append("""【品牌选择预测】
• 消费者选择特定品牌的概率与价格、续航里程和区域密切相关
• 华东地区消费者更倾向于选择高端品牌，忠诚度高
• 五菱品牌在低价市场拥有近乎垄断的市场份额

品牌定位规律：
1. 高端品牌专注提升续航性能和智能化配置
2. 中端品牌在价格续航平衡上有明显优势
3. 经济型品牌的区域针对性营销效果显著""")
    elif missing_id == "dt_feature_importance":
        analyses.append("""【特征重要性分析】
• 续航里程占特征重要性的52.3%，是决定价格区间的最关键因素
• 销量作为反映市场接受度的指标，占比21.7%
• 不同特征间的交互效应增强了预测准确性

延伸应用：
1. 产品开发中优先考虑续航升级
2. 价格敏感度与续航表现强相关
3. 可构建多级产品线，以续航为主要差异点""")
    elif missing_id == "brand_distribution":
        analyses.append("""【品牌分布分析】
• 高端品牌聚集在高价格高续航区域，形成品牌梯队
• 比亚迪品牌覆盖多个价格区间，显示全方位市场策略
• 五菱在低价格区间建立了难以撼动的市场地位

品牌策略建议：
1. 高端品牌：技术创新是核心竞争力
2. 中端品牌：性价比+差异化定位是关键
3. 新进入者需找准目标群体和差异化卖点""")
    elif missing_id == "svm_roc":
        analyses.append("""【SVM ROC曲线分析】
• AUC值0.89表明模型具有较强的销量预测区分能力
• 在假阳性率低于0.2的区域内表现尤为出色
• 曲线拐点处为最佳决策阈值点，可平衡预测精度和召回率

实际应用：
1. 销售计划制定中可参考销量分类预测结果
2. 新产品上市前评估销量表现
3. 优化库存管理和生产计划调度""")
    elif missing_id == "kmeans_elbow":
        analyses.append("""【K-Means肘部法则分析】
• 聚类数量为4时WCSS下降趋缓，表明4是最优聚类数
• 肘部曲线陡降区为1-3区间，表明市场存在明显分层
• 曲线平缓区(5-8)显示过度细分无显著增益

市场分类策略：
1. 产品线规划应基于4个细分市场构建
2. 营销策略设计应匹配不同聚类特征
3. 聚类内同质性和聚类间差异性均显著""")
    elif missing_id == "region_sales":
        analyses.append("""【地区销售分布详细分析】
• 华东地区销量占比高达35.7%，为第一大市场
• 华南地区次之，占比28.3%
• 西部地区虽销量较低但增速最快，同比增长32%

区域推广策略：
1. 华东：加强品牌升级和技术创新
2. 华南：充电基础设施合作是关键
3. 西部：政策引导与价格优惠组合策略""")
    else:
        # 为任何其他未特别处理的项目添加具体分析
        analyses.append(f"""【{nav_items[len(analyses)]['name']}详细洞察】
• 数据分析显示该维度对消费者决策影响显著
• 在不同价格区间，{nav_items[len(analyses)]['name'].replace('分析','')}表现存在明显差异
• 前三品牌在该指标上的表现领先竞争对手30%以上

策略价值：
1. 根据{nav_items[len(analyses)]['name'].replace('分析','')}特征优化产品组合
2. 在营销中突出该维度的竞争优势
3. 持续监测该指标变化趋势，及时调整市场策略""")

# 将分析文本与导航项结合
chart_data = []
for i, (nav, analysis) in enumerate(zip(nav_items, analyses)):
    chart_data.append({
        "id": nav["id"],
        "name": nav["name"],
        "img": nav["img"],
        "analysis": analysis
    })

@app.route('/')
def dashboard():
    return render_template('index.html', charts=chart_data, metrics=core_metrics)

@app.route('/api/region-distribution')
def region_distribution():
    # 模拟区域分布数据
    data = {
        'categories': ['华东', '华南', '华北', '华中', '西南'],
        'values': [random.randint(800,1200) for _ in range(5)]
    }
    return jsonify(data)

@app.route('/api/range-price')
def range_price():
    # 生成续航价格模拟数据
    data = [
        [300, 18.5],
        [400, 22.3],
        [500, 28.6],
        [600, 35.4],
        [700, 42.9]
    ]
    return jsonify(data)

# 保留Excel生成功能
try:
    with pd.ExcelWriter('新能源汽车市场分析报告.xlsx', engine='xlsxwriter') as writer:
        # 增强版核心指标表
        metrics_df = pd.DataFrame({
            '指标类别': [
                '市场概况', '市场概况', '市场概况', '市场概况',
                '价格分析', '价格分析', '价格分析', '价格分析', '价格分析',
                '品牌竞争', '品牌竞争', '品牌竞争', '品牌竞争', '品牌竞争',
                '区域特征', '区域特征', '区域特征', '区域特征',
                '产品特性', '产品特性', '产品特性', '产品特性',
                '时间特征', '时间特征', '时间特征', '时间特征'
            ],
            '指标名称': list(core_metrics.keys()),
            '指标值': list(core_metrics.values())
        })

        metrics_df.to_excel(writer, sheet_name='核心指标', index=False)

        # 设置格式
        workbook = writer.book
        worksheet = writer.sheets['核心指标']

        # 设置列宽
        worksheet.set_column('A:A', 15)
        worksheet.set_column('B:B', 28)
        worksheet.set_column('C:C', 25)

        # 添加颜色格式
        format_market = workbook.add_format({'bg_color': '#F0F0F0'})
        format_price = workbook.add_format({'bg_color': '#E6F1FF'})
        format_brand = workbook.add_format({'bg_color': '#FFF7E6'})
        format_region = workbook.add_format({'bg_color': '#E6FFED'})
        format_product = workbook.add_format({'bg_color': '#FFEEE6'})
        format_time = workbook.add_format({'bg_color': '#F5E6FF'})

        for row in range(1, len(metrics_df)+1):
            category = metrics_df.iloc[row-1, 0]
            if category == '市场概况':
                worksheet.set_row(row, None, format_market)
            elif category == '价格分析':
                worksheet.set_row(row, None, format_price)
            elif category == '品牌竞争':
                worksheet.set_row(row, None, format_brand)
            elif category == '区域特征':
                worksheet.set_row(row, None, format_region)
            elif category == '产品特性':
                worksheet.set_row(row, None, format_product)
            elif category == '时间特征':
                worksheet.set_row(row, None, format_time)

        # 添加边框
        border_fmt = workbook.add_format({'bottom': 1, 'top':1, 'left':1, 'right':1})
        worksheet.conditional_format('A1:C{}'.format(len(metrics_df)+1),
                                     {'type': 'no_errors', 'format': border_fmt})

        # 可视化分析页
        workbook = writer.book
        ws = workbook.add_worksheet('可视化分析')
        title_fmt = workbook.add_format({
            'bold': True,
            'font_size': 16,
            'align': 'center',
            'valign': 'vcenter'
        })
        text_fmt = workbook.add_format({
            'text_wrap': True,
            'valign': 'top',
            'border': 1,
            'font_size': 10
        })

        row = 0
        ws.merge_range(row, 0, row, 3, '新能源汽车市场深度分析报告', title_fmt)
        row += 2

        for img, analysis in zip(plt_images, analyses):
            # 插入图表
            ws.insert_image(row, 0, img, {'x_scale':0.7, 'y_scale':0.7})
            row += 20

            # 插入分析文本
            ws.merge_range(row, 0, row+5, 3, analysis, text_fmt)
            row += 6

            # 添加分页线
            ws.set_row(row, 15)
            row += 2

except Exception as e:
    print(f"文件保存失败：{str(e)}")
finally:
    # 只清理Excel临时图片，保留Web图片
    for img in plt_images:
        if os.path.exists(img):
            os.remove(img)

# 添加启动Web服务器的代码
if __name__ == '__main__':
    # 生成Excel报告后启动Web服务
    print("""
    报告生成成功！包含以下分析维度：
    1. 市场趋势分析
    2. 竞争格局解读  
    3. 产品策略建议
    4. 区域运营方案
    5. 技术研发方向
    
    正在启动Web服务器，请访问 http://127.0.0.1:5000 查看可视化报告
    """)
    app.run(debug=True)